package com.shujia.spark.core

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Demo7GroupBy {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName("groupBy")
    val sc = new SparkContext(conf)

    val linesRDD: RDD[String] = sc.textFile("data/students.txt")

    /**
     * groupBy: 按照一个字段进行分组，将相同的key分到同一个组内，会产生shuffle
     *
     * Iterable: 迭代器，可以看作时集合，但是集合的数据是保存再内存中的，而迭代器的数据没有完全再内存中，取多少读读多少
     *
     */
    //按照班级进行分组，分组之后，key时班级，value是一个迭代器，迭代器中使用同一个班级所有的学生
    val groupBYRDD: RDD[(String, Iterable[String])] = linesRDD.groupBy(line => {
      //选择分组的字段
      line.split(",").last
    })

    //计算班级的人数
    val clazzNumRDD: RDD[(String, Int)] = groupBYRDD.map {
      case (clazz: String, iter: Iterable[String]) =>
        //统计人数
        val num: Int = iter.size
        (clazz, num)
    }

    clazzNumRDD.foreach(println)
  }
}
